--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/identity_context.py 72a5aac40da73e8ab757cae754a2a46ef3b6918a (72a5aac4) Text, 23.91 KB
Tff7b72import T7ee787asyncio
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787os
Tff7b72import T7ee787threading
Tff7b72import T7ee787RNS
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787announce_handler Tff7b72import Te6edf3AnnounceHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787announce_manager Tff7b72import Te6edf3AnnounceManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787archiver_manager Tff7b72import Te6edf3ArchiverManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787auto_propagation_manager Tff7b72import Te6edf3AutoPropagationManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787bot_handler Tff7b72import Te6edf3BotHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787community_interfaces Tff7b72import Te6edf3CommunityInterfacesManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787config_manager Tff7b72import Te6edf3ConfigManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Te6edf3Database
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787docs_manager Tff7b72import Te6edf3DocsManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787forwarding_manager Tff7b72import Te6edf3ForwardingManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787integrity_manager Tff7b72import Te6edf3IntegrityManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787map_manager Tff7b72import Te6edf3MapManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787meshchat_utils Tff7b72import Te6edf3create_lxmf_router
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787message_handler Tff7b72import Te6edf3MessageHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787nomadnet_utils Tff7b72import Te6edf3NomadNetworkManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787ringtone_manager Tff7b72import Te6edf3RingtoneManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rncp_handler Tff7b72import Te6edf3RNCPHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rnpath_handler Tff7b72import Te6edf3RNPathHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rnpath_trace_handler Tff7b72import Te6edf3RNPathTraceHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rnprobe_handler Tff7b72import Te6edf3RNProbeHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rnstatus_handler Tff7b72import Te6edf3RNStatusHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telephone_manager Tff7b72import Te6edf3TelephoneManager
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787translator_handler Tff7b72import Te6edf3TranslatorHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787voicemail_manager Tff7b72import Te6edf3VoicemailManager
Tff7b72class T56d364IdentityContextTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffidentity_hash Tff7b72= Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
T8b949e# Storage paths
Tff7b72selfTff7b72.Td2a8ffstorage_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(
Te6edf3appTff7b72.Td2a8ffstorage_dirTb4b4b4,
Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4,
Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabase_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4, Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_router_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4, Ta5d6ff"Ta5d6fflxmf_routerTa5d6ff"Tb4b4b4)
T8b949e# Identity backup
Te6edf3identity_backup_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4, Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3identity_backup_fileTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3identity_backup_fileTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3identityTff7b72.Td2a8ffget_private_keyTb4b4b4(Tb4b4b4)Tb4b4b4)
T8b949e# Session ID for this specific context instance
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3appTb4b4b4, Ta5d6ff"Ta5d6ff_identity_session_id_counterTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3appTff7b72.Td2a8ff_identity_session_id_counter Tff7b72= T79c0ff0
Te6edf3appTff7b72.Td2a8ff_identity_session_id_counter Tff7b72+Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffsession_id Tff7b72= Te6edf3appTff7b72.Td2a8ff_identity_session_id_counter
T8b949e# Initialized state
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmessage_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffarchiver_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmap_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffdocs_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnomadnet_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftelephone_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffvoicemail_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffringtone_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffauto_propagation_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrncp_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnstatus_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnpath_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnpath_trace_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrnprobe_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftranslator_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffbot_handler Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffforwarding_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcommunity_interfaces_manager Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflocal_lxmf_destination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_handlers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffintegrity_manager Tff7b72= Te6edf3IntegrityManagerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72False
Tff7b72def Td2a8ff_rncp_emit_receive_completedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787async_utils Tff7b72import Te6edf3AsyncUtils
Te6edf3AsyncUtilsTff7b72.Td2a8ffrun_asyncTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ff_broadcast_websocket_messageTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrncp.receive.completedTa5d6ff"Tb4b4b4, Tff7b72*Tff7b72*Te6edf3payloadTb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ffsetupTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSetting up Identity Context for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4)
T8b949e# 0. Clear any previous integrity and database health issues on the app
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffintegrity_issues Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdatabase_health_issues Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# 1. Cleanup RNS state for this identity if any lingers
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcleanup_rns_state_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)
T8b949e# 2. Initialize Database
Tff7b72if Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEMERGENCY MODE ENABLED: Using in-memory database.Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3DatabaseTb4b4b4(Ta5d6ff"Ta5d6ff:memory:Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3DatabaseTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4)
T8b949e# Check Integrity (skip in emergency mode)
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3is_okTb4b4b4, Te6edf3issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffintegrity_managerTff7b72.Td2a8ffcheck_integrityTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3is_okTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffINTEGRITY WARNING for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3issuesTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffintegrity_issuesTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffintegrity_issues Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffintegrity_issuesTff7b72.Td2a8ffextendTb4b4b4(Te6edf3issuesTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmigrate_from_legacyTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffreticulum_config_dirTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffidentity_hashTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ff_tune_sqlite_pragmasTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffauto_recover Tff7b72and Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72raise
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffDatabase initialization failed for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff, attempting recovery: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ff_run_startup_auto_recoveryTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ff_tune_sqlite_pragmasTb4b4b4(Tb4b4b4)
T8b949e# 3. Initialize Config and Managers
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4)
T8b949e# Apply overrides from CLI/ENV if provided
Tff7b72if Tb4b4b4(
Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffgitea_base_url_overrideTa5d6ff"Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffgitea_base_url_override
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgitea_base_urlTff7b72.Td2a8ffsetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffgitea_base_url_overrideTb4b4b4)
Tff7b72if Tb4b4b4(
Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffdocs_download_urls_overrideTa5d6ff"Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdocs_download_urls_override
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdocs_download_urlsTff7b72.Td2a8ffsetTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdocs_download_urls_overrideTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_handler Tff7b72= Te6edf3MessageHandlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_manager Tff7b72= Te6edf3AnnounceManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4, Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffarchiver_manager Tff7b72= Te6edf3ArchiverManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmap_manager Tff7b72= Te6edf3MapManagerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4, Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffstorage_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdocs_manager Tff7b72= Te6edf3DocsManagerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffget_public_pathTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3project_rootTff7b72=Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Tff7b72__file__Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnomadnet_manager Tff7b72= Te6edf3NomadNetworkManagerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffarchiver_managerTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4,
Tb4b4b4)
T8b949e# Vacuum and mark stuck messages
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffproviderTff7b72.Td2a8ffvacuumTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessagesTff7b72.Td2a8ffmark_stuck_messages_as_failedTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3db_issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcheck_db_health_at_openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4)
Tff7b72if Te6edf3db_issuesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdatabase_health_issues Tff7b72= Te6edf3db_issues
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffDatabase health check for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3db_issuesTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# 4. Initialize LXMF Router
Te6edf3propagation_stamp_cost Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_propagation_node_stamp_costTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3create_lxmf_routerTb4b4b4(
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3storagepathTff7b72=Tff7b72selfTff7b72.Td2a8fflxmf_router_pathTb4b4b4,
Te6edf3propagation_costTff7b72=Te6edf3propagation_stamp_costTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffPROCESSING_INTERVAL Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdelivery_per_transfer_limit Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_delivery_transfer_limit_in_bytesTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000
Tb4b4b4)
T8b949e# Register LXMF delivery identity
Te6edf3inbound_stamp_cost Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_inbound_stamp_costTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflocal_lxmf_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3display_nameTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffdisplay_nameTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stamp_costTff7b72=Te6edf3inbound_stamp_costTb4b4b4,
Tb4b4b4)
T8b949e# Forwarding Manager
Tff7b72selfTff7b72.Td2a8ffforwarding_manager Tff7b72= Te6edf3ForwardingManagerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4,
Tff7b72selfTff7b72.Td2a8fflxmf_router_pathTb4b4b4,
Tff7b72lambda Te6edf3msgTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_lxmf_deliveryTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Te6edf3configTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffforwarding_managerTff7b72.Td2a8ffload_aliasesTb4b4b4(Tb4b4b4)
T8b949e# Register delivery callback
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(
Tff7b72lambda Te6edf3msgTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_lxmf_deliveryTb4b4b4(Te6edf3msgTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# Restore preferred propagation node on startup
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3preferred_node Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tff7b72if Te6edf3preferred_nodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffset_active_propagation_nodeTb4b4b4(Te6edf3preferred_nodeTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)
T8b949e# 5. Initialize Handlers and Managers
Tff7b72selfTff7b72.Td2a8ffrncp_handler Tff7b72= Te6edf3RNCPHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffstorage_dirTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrncp_handlerTff7b72.Td2a8ffon_receive_completed Tff7b72= Tff7b72selfTff7b72.Td2a8ff_rncp_emit_receive_completed
Tff7b72selfTff7b72.Td2a8ffrnstatus_handler Tff7b72= Te6edf3RNStatusHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrnpath_handler Tff7b72= Te6edf3RNPathHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrnpath_trace_handler Tff7b72= Te6edf3RNPathTraceHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrnprobe_handler Tff7b72= Te6edf3RNProbeHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Te6edf3identityTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Tb4b4b4)
Te6edf3libretranslate_url Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fflibretranslate_urlTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Te6edf3translator_enabled Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fftranslator_enabledTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftranslator_handler Tff7b72= Te6edf3TranslatorHandlerTb4b4b4(
Te6edf3libretranslate_urlTff7b72=Te6edf3libretranslate_urlTb4b4b4,
Te6edf3enabledTff7b72=Te6edf3translator_enabledTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbot_handler Tff7b72= Te6edf3BotHandlerTb4b4b4(
Te6edf3identity_pathTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Te6edf3config_managerTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbot_handlerTff7b72.Td2a8ffrestore_enabled_botsTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to restore bots: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Initialize managers
Tff7b72selfTff7b72.Td2a8fftelephone_manager Tff7b72= Te6edf3TelephoneManagerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3config_managerTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Te6edf3dbTff7b72=Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffget_name_for_identity_hash
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffon_initiation_status_callback Tff7b72= Tff7b72lambda Te6edf3statusTb4b4b4, Te6edf3targetTb4b4b4: Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_telephone_initiation_statusTb4b4b4(
Te6edf3statusTb4b4b4,
Te6edf3targetTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffregister_ringing_callbackTb4b4b4(
Tff7b72lambda Te6edf3callTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_incoming_telephone_callTb4b4b4(Te6edf3callTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffregister_established_callbackTb4b4b4(
Tff7b72lambda Te6edf3callTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_telephone_call_establishedTb4b4b4(Te6edf3callTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffregister_ended_callbackTb4b4b4(
Tff7b72lambda Te6edf3callTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_telephone_call_endedTb4b4b4(Te6edf3callTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e# Only initialize telephone hardware/profile if not in emergency mode
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffinit_telephoneTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvoicemail_manager Tff7b72= Te6edf3VoicemailManagerTb4b4b4(
Te6edf3dbTff7b72=Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4,
Te6edf3configTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3telephone_managerTff7b72=Tff7b72selfTff7b72.Td2a8fftelephone_managerTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffget_name_for_identity_hash
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffon_new_voicemail_callback Tff7b72= Tff7b72lambda Te6edf3vmTb4b4b4: Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_new_voicemail_receivedTb4b4b4(Te6edf3vmTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffringtone_manager Tff7b72= Te6edf3RingtoneManagerTb4b4b4(
Te6edf3configTff7b72=Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3storage_dirTff7b72=Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcommunity_interfaces_manager Tff7b72= Te6edf3CommunityInterfacesManagerTb4b4b4(
Te6edf3public_override_pathTff7b72=Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffget_public_pathTb4b4b4(Ta5d6ff"Ta5d6ffcommunity_interfaces.jsonTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffauto_propagation_manager Tff7b72= Te6edf3AutoPropagationManagerTb4b4b4(
Te6edf3appTff7b72=Tff7b72selfTff7b72.Td2a8ffappTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)
T8b949e# 6. Register Announce Handlers
Tff7b72selfTff7b72.Td2a8ffregister_announce_handlersTb4b4b4(Tb4b4b4)
T8b949e# 7. Start background threads
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffstart_background_threadsTb4b4b4(Tb4b4b4)
T8b949e# 8. Handle initial documentation download
Tff7b72if Tb4b4b4(
Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffinitial_docs_download_attemptedTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)
Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdocs_managerTff7b72.Td2a8ffhas_docsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffTriggering initial documentation download for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdocs_managerTff7b72.Td2a8ffupdate_docsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffinitial_docs_download_attemptedTff7b72.Td2a8ffsetTb4b4b4(Tff7b72TrueTb4b4b4)
T8b949e# Baseline integrity manifest after successful setup
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffintegrity_managerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity Context for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff is now running.Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffstart_background_threadsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# start background thread for auto announce loop
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffannounce_loopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsession_idTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# start background thread for auto syncing propagation nodes
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffannounce_sync_propagation_nodesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsession_idTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# start background thread for crawler loop
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcrawler_loopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsession_idTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# start background thread for auto backup loop
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffauto_backup_loopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsession_idTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# start background thread for telemetry tracking loop
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8fftelemetry_tracking_loopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsession_idTb4b4b4, Te6edf3contextTff7b72=Tff7b72selfTb4b4b4)Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# start background thread for auto propagation node selection
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Te6edf3asyncioTff7b72.Td2a8ffrunTb4b4b4,
Te6edf3argsTff7b72=Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffauto_propagation_managerTff7b72.Td2a8ff_runTb4b4b4(Tb4b4b4)Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffregister_announce_handlersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3handlers Tff7b72= Tb4b4b4[
Te6edf3AnnounceHandlerTb4b4b4(
Ta5d6ff"Ta5d6fflxst.telephonyTa5d6ff"Tb4b4b4,
Tff7b72lambda Te6edf3aspectTb4b4b4, Te6edf3dhTb4b4b4, Te6edf3aiTb4b4b4, Te6edf3adTb4b4b4, Te6edf3aphTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_telephone_announce_receivedTb4b4b4(
Te6edf3aspectTb4b4b4,
Te6edf3dhTb4b4b4,
Te6edf3aiTb4b4b4,
Te6edf3adTb4b4b4,
Te6edf3aphTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3AnnounceHandlerTb4b4b4(
Ta5d6ff"Ta5d6fflxmf.deliveryTa5d6ff"Tb4b4b4,
Tff7b72lambda Te6edf3aspectTb4b4b4, Te6edf3dhTb4b4b4, Te6edf3aiTb4b4b4, Te6edf3adTb4b4b4, Te6edf3aphTb4b4b4: Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_lxmf_announce_receivedTb4b4b4(
Te6edf3aspectTb4b4b4,
Te6edf3dhTb4b4b4,
Te6edf3aiTb4b4b4,
Te6edf3adTb4b4b4,
Te6edf3aphTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3AnnounceHandlerTb4b4b4(
Ta5d6ff"Ta5d6fflxmf.propagationTa5d6ff"Tb4b4b4,
Tff7b72lambda Te6edf3aspectTb4b4b4, Te6edf3dhTb4b4b4, Te6edf3aiTb4b4b4, Te6edf3adTb4b4b4, Te6edf3aphTb4b4b4: Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_lxmf_propagation_announce_receivedTb4b4b4(
Te6edf3aspectTb4b4b4,
Te6edf3dhTb4b4b4,
Te6edf3aiTb4b4b4,
Te6edf3adTb4b4b4,
Te6edf3aphTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3AnnounceHandlerTb4b4b4(
Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"Tb4b4b4,
Tff7b72lambda Te6edf3aspectTb4b4b4, Te6edf3dhTb4b4b4, Te6edf3aiTb4b4b4, Te6edf3adTb4b4b4, Te6edf3aphTb4b4b4: Tb4b4b4(
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffon_nomadnet_node_announce_receivedTb4b4b4(
Te6edf3aspectTb4b4b4,
Te6edf3dhTb4b4b4,
Te6edf3aiTb4b4b4,
Te6edf3adTb4b4b4,
Te6edf3aphTb4b4b4,
Te6edf3contextTff7b72=Tff7b72selfTb4b4b4,
Tb4b4b4)
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4]
Tff7b72for Te6edf3handler Tff7b72in Te6edf3handlersTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3handlerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_handlersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3handlerTb4b4b4)
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTearing down Identity Context for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffauto_propagation_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffauto_propagation_managerTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffauto_propagation_manager Tff7b72= Tff7b72None
T8b949e# 1. Deregister announce handlers
Tff7b72for Te6edf3handler Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_handlersTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_announce_handlerTb4b4b4(Te6edf3handlerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_handlers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffforwarding_managerTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffforwarding_managerTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError tearing down forwarding manager for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffforwarding_manager Tff7b72= Tff7b72None
T8b949e# 2. Cleanup RNS destinations and links
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrncp_handlerTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrncp_handlerTff7b72.Td2a8ffteardown_receive_destinationTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrncp_handler Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4:
T8b949e# Break cycles in mocks/objects
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4, Ta5d6ff"Ta5d6ffregister_delivery_callbackTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72NoneTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4, Ta5d6ff"Ta5d6ffdelivery_destinationsTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3dest_hash Tff7b72in Tffa657listTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdelivery_destinationsTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdelivery_destinationsTb4b4b4[Te6edf3dest_hashTb4b4b4]
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_destinationTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72if Tb4b4b4(
Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4, Ta5d6ff"Ta5d6ffpropagation_destinationTa5d6ff"Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_destination
Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_destinationTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_destinationTb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephone_manager Tff7b72and Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTb4b4b4:
Tff7b72if Tb4b4b4(
Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTb4b4b4, Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4)
Tff7b72and Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffdestination
Tb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_destinationTb4b4b4(
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffdestinationTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffcleanup_rns_state_for_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError during RNS cleanup for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# 3. Stop LXMF Router jobs
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffjobs Tff7b72= Tff7b72lambdaTb4b4b4: Tff7b72None
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTb4b4b4, Ta5d6ff"Ta5d6ffexit_handlerTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffexit_handlerTb4b4b4(Tb4b4b4)
T8b949e# Give LXMF/RNS a moment to finish any final disk writes
Tff7b72import T7ee787time
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.0Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError while tearing down LXMRouter for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Tff7b72None
T8b949e# 4. Stop telephone and voicemail
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephone_managerTb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Clear callbacks to break reference cycles
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffon_initiation_status_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftelephone_managerTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError while tearing down telephone for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffvoicemail_managerTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffon_new_voicemail_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffvoicemail_managerTff7b72.Td2a8ffget_name_for_identity_hash Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffvoicemail_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_handlerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_handler Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffannounce_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffarchiver_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffarchiver_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmap_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmap_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdocs_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdocs_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnomadnet_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnomadnet_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffbot_handlerTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbot_handlerTff7b72.Td2a8ffstop_allTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while stopping bots for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbot_handler Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdatabaseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTb4b4b4, Ta5d6ff"Ta5d6ffemergencyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3close_issues Tff7b72= Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffcheck_db_health_at_closeTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffstorage_pathTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3close_issuesTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffDatabase health at close for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3close_issuesTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# 1. Checkpoint WAL and close database cleanly to ensure file is stable for hashing
Tff7b72selfTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ff_checkpoint_and_closeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffError closing database during teardown for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# 2. Save integrity manifest AFTER closing to capture final stable state
Tff7b72if Tff7b72selfTff7b72.Td2a8ffintegrity_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffintegrity_managerTff7b72.Td2a8ffsave_manifestTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdatabase Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffintegrity_managerTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffintegrity_manager Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8fflocal_lxmf_destinationTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflocal_lxmf_destination Tff7b72= Tff7b72None
T8b949e# Final break of the largest cycle
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Tff7b72None
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffIdentity Context for Tffd700{Tff7b72selfTff7b72.Td2a8ffidentity_hashTffd700}Ta5d6ff torn down.Ta5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────